--[[

************************************************************************

ARLDatamine.lua

In-game datamining functions for ARL

File date: 2009-07-29T22:39:18Z
File revision: 2262
Project revision: 2271
Project version: r2271

************************************************************************

Please see http://www.wowace.com/projects/arl/for more information.

License:
	Please see LICENSE.txt

This source code is released under All Rights Reserved.

************************************************************************

]]--


-------------------------------------------------------------------------------
-- AddOn namespace.
-------------------------------------------------------------------------------
local MODNAME			= "Ackis Recipe List"
local addon			= LibStub("AceAddon-3.0"):GetAddon(MODNAME)

local L				= LibStub("AceLocale-3.0"):GetLocale(MODNAME)


-------------------------------------------------------------------------------
-- Upvalues globals.
-------------------------------------------------------------------------------
local table,string = table,string

local tconcat,tinsert,tsort,twipe = table.concat,table.insert,table.sort,table.wipe
local strlower,strmatch = string.lower,string.match
local gsub = string.gsub
local tonumber,tostring = tonumber,tostring
local ipairs,pairs = ipairs,pairs

-------------------------------------------------------------------------------
-- Upvalued Blizzard API.
-------------------------------------------------------------------------------
local UnitName = UnitName
local UnitGUID = UnitGUID
local UnitExists = UnitExists
local UnitIsPlayer = UnitIsPlayer
local UnitIsEnemy = UnitIsEnemy
local GetNumTrainerServices = GetNumTrainerServices
local GetTrainerServiceInfo = GetTrainerServiceInfo
local IsTradeskillTrainer = IsTradeskillTrainer
local SetTrainerServiceTypeFilter = SetTrainerServiceTypeFilter
local GetTrainerServiceTypeFilter = GetTrainerServiceTypeFilter
local GetTrainerServiceSkillReq = GetTrainerServiceSkillReq
local GetMerchantNumItems = GetMerchantNumItems
local GetMerchantItemLink = GetMerchantItemLink
local GetMerchantItemInfo = GetMerchantItemInfo
local GetSpellInfo = GetSpellInfo

-------------------------------------------------------------------------------
-- Tradeskill professions
-------------------------------------------------------------------------------
local PROFESSIONS = {
	["Alchemy"]		= GetSpellInfo(51304),
	["Blacksmithing"]	= GetSpellInfo(51300),
	["Cooking"]		= GetSpellInfo(51296),
	["Enchanting"]		= GetSpellInfo(51313),
	["Engineering"]		= GetSpellInfo(51306),
	["FirstAid"]		= GetSpellInfo(45542),
	["Inscription"]		= GetSpellInfo(45363),
	["Jewelcrafting"]	= GetSpellInfo(51311),
	["Leatherworking"]	= GetSpellInfo(51302),
	["Runeforging"]		= GetSpellInfo(53428),
	["Smelting"]		= GetSpellInfo(32606),
	["Tailoring"]		= GetSpellInfo(51309),
}

-------------------------------------------------------------------------------
-- Mined via Data-tools
-- Table is Public Domain now
-------------------------------------------------------------------------------
local SPELL_ITEM = {
	-------------------------------------------------------------------------------
	-- First Aid
	-------------------------------------------------------------------------------
	[7929] = 16112,		[7935] = 6454,		[10840] = 16113,	[23787] = 19442,
	[27032] = 21992,	[27033] = 21993,	[45546] = 39152,

	-------------------------------------------------------------------------------
	-- Alchemy
	-------------------------------------------------------------------------------
	[2333] = 3396,		[2335] = 2555,		[3172] = 3393,		[3174] = 3394,
	[3175] = 3395,		[3188] = 6211,		[3230] = 2553,		[3449] = 6068,
	[3450] = 3830,		[3451] = 3831,		[3453] = 3832,		[3454] = 14634,
	[4508] = 4597,		[4942] = 4624,		[6617] = 5640,		[6618] = 5643,
	[6624] = 5642,		[7255] = 6053,		[7256] = 6054,		[7257] = 6055,
	[7258] = 6056,		[7259] = 6057,		[8240] = 6663,		[11453] = 9293,
	[11456] = 10644,	[11458] = 9294,		[11459] = 9303,		[11464] = 9295,
	[11466] = 9296,		[11468] = 9297,		[11472] = 9298,		[11473] = 9302,
	[11476] = 9301,		[11477] = 9300,		[11479] = 9304,		[11480] = 9305,
	[17187] = 12958,	[17552] = 13476,	[17553] = 13477,	[17554] = 13478,
	[17555] = 13479,	[17556] = 13480,	[17557] = 13481,	[17559] = 13482,
	[17560] = 13483,	[17561] = 13484,	[17562] = 13485,	[17563] = 13486,
	[17564] = 13487,	[17565] = 13488,	[17566] = 13489,	[17570] = 13490,
	[17571] = 13491,	[17572] = 13492,	[17573] = 13493,	[17574] = 13494,
	[17575] = 13495,	[17576] = 13496,	[17577] = 13497,	[17578] = 13499,
	[17580] = 13501,	[17632] = 13517,	[17634] = 13518,	[17635] = 31354,
	[17636] = 31356,	[17637] = 31355,	[17638] = 31357,	[21923] = 17709,
	[22732] = 18257,	[24365] = 20011,	[24366] = 20012,	[24367] = 20013,
	[24368] = 20014,	[25146] = 20761,	[26277] = 21547,	[28543] = 22900,
	[28546] = 22901,	[28549] = 22902,	[28550] = 22903,	[28552] = 22904,
	[28553] = 24001,	[28554] = 22906,	[28555] = 22907,	[28556] = 22908,
	[28557] = 22909,	[28558] = 22910,	[28562] = 22911,	[28563] = 22912,
	[28564] = 35295,	[28565] = 22914,	[28566] = 22915,	[28567] = 22916,
	[28568] = 30443,	[28569] = 22918,	[28570] = 22919,	[28571] = 22920,
	[28572] = 22921,	[28573] = 22922,	[28575] = 22923,	[28576] = 22924,
	[28577] = 22925,	[28578] = 35294,	[28579] = 22927,	[29688] = 23574,
	[32765] = 25869,	[32766] = 29232,	[38960] = 31680,	[38961] = 31682,
	[38962] = 31681,	[39637] = 32070,	[39639] = 32071,	[42736] = 33209,
	[47046] = 35752,	[47048] = 35753,	[47049] = 35754,	[47050] = 35755,
	[53936] = 44564,	[53937] = 44566,	[53938] = 44568,	[53939] = 44565,
	[53942] = 44567,

	-------------------------------------------------------------------------------
	-- Blacksmithing
	-------------------------------------------------------------------------------
	[2667] = 2881,		[2673] = 5578,		[3295] = 2883,		[3297] = 3608,
	[3321] = 3609,		[3325] = 3610,		[3330] = 2882,		[3334] = 3611,
	[3336] = 3612,		[3492] = 12162,		[3493] = 3866,		[3494] = 10858,
	[3495] = 3867,		[3496] = 12163,		[3497] = 3868,		[3498] = 12164,
	[3500] = 3869,		[3503] = 6047,		[3504] = 3870,		[3505] = 3871,
	[3507] = 3872,		[3511] = 3873,		[3513] = 3874,		[3515] = 3875,
	[6518] = 5543,		[7221] = 6044,		[7222] = 6045,		[7224] = 6046,
	[8367] = 6735,		[9811] = 7978,		[9813] = 7979,		[9814] = 7980,
	[9818] = 7981,		[9820] = 7982,		[9933] = 7975,		[9937] = 7995,
	[9939] = 7976,		[9945] = 7983,		[9950] = 7984,		[9952] = 7985,
	[9964] = 7989,		[9966] = 7991,		[9970] = 7990,		[9995] = 7992,
	[9997] = 8029,		[10005] = 7993,		[10009] = 8028,		[10013] = 8030,
	[11454] = 10713,	[11643] = 9367,		[12259] = 10424,	[15292] = 11610,
	[15293] = 11614,	[15294] = 11611,	[15295] = 11615,	[15296] = 11612,
	[15973] = 12261,	[16642] = 12682,	[16643] = 12683,	[16644] = 12684,
	[16645] = 12685,	[16646] = 12687,	[16647] = 12688,	[16648] = 12689,
	[16649] = 12690,	[16650] = 12691,	[16651] = 12692,	[16652] = 12693,
	[16653] = 12694,	[16654] = 12695,	[16655] = 12699,	[16656] = 12697,
	[16657] = 12700,	[16658] = 12701,	[16659] = 12702,	[16660] = 12698,
	[16661] = 12703,	[16662] = 12704,	[16663] = 12705,	[16664] = 12706,
	[16665] = 12707,	[16667] = 12696,	[16724] = 12711,	[16725] = 12713,
	[16726] = 12714,	[16728] = 12716,	[16729] = 12717,	[16730] = 12715,
	[16731] = 12718,	[16732] = 12719,	[16741] = 12720,	[16742] = 12725,
	[16744] = 12726,	[16745] = 12727,	[16746] = 12728,	[16969] = 12819,
	[16970] = 12821,	[16971] = 12823,	[16973] = 12824,	[16978] = 12825,
	[16983] = 12827,	[16984] = 12828,	[16985] = 12830,	[16988] = 12833,
	[16990] = 12834,	[16991] = 12835,	[16992] = 12836,	[16993] = 12837,
	[16994] = 12838,	[16995] = 12839,	[20872] = 17049,	[20873] = 17053,
	[20874] = 17051,	[20876] = 17052,	[20890] = 17059,	[20897] = 17060,
	[21161] = 18592,	[21913] = 17706,	[22757] = 18264,	[23628] = 19202,
	[23629] = 19204,	[23632] = 19203,	[23633] = 19205,	[23636] = 19206,
	[23637] = 19207,	[23638] = 19208,	[23639] = 19209,	[23650] = 19210,
	[23652] = 19211,	[23653] = 19212,	[24136] = 19776,	[24137] = 19777,
	[24138] = 19778,	[24139] = 19779,	[24140] = 19780,	[24141] = 19781,
	[24399] = 20040,	[24912] = 20553,	[24913] = 20555,	[24914] = 20554,
	[27585] = 22209,	[27586] = 22219,	[27587] = 22222,	[27588] = 22214,
	[27589] = 22220,	[27590] = 22221,	[27829] = 22388,	[27830] = 22390,
	[27832] = 22389,	[28461] = 22766,	[28462] = 22767,	[28463] = 22768,
	[29566] = 23590,	[29568] = 23591,	[29569] = 23592,	[29571] = 23593,
	[29603] = 23594,	[29605] = 23595,	[29606] = 23596,	[29608] = 23597,
	[29610] = 23599,	[29611] = 23598,	[29613] = 23600,	[29614] = 23601,
	[29615] = 23602,	[29616] = 23603,	[29617] = 23604,	[29619] = 23605,
	[29620] = 23606,	[29621] = 23607,	[29622] = 23621,	[29628] = 23608,
	[29629] = 23609,	[29630] = 23610,	[29642] = 23611,	[29643] = 23612,
	[29645] = 23613,	[29648] = 23615,	[29649] = 23617,	[29656] = 23618,
	[29657] = 24002,	[29658] = 23620,	[29662] = 23622,	[29663] = 23623,
	[29664] = 23624,	[29668] = 23625,	[29669] = 23626,	[29671] = 23627,
	[29672] = 23628,	[29692] = 23629,	[29693] = 23630,	[29694] = 23631,
	[29695] = 23632,	[29696] = 23633,	[29697] = 23634,	[29698] = 23635,
	[29699] = 23636,	[29700] = 23637,	[29728] = 23638,	[29729] = 23639,
	[32285] = 25526,	[32656] = 25846,	[32657] = 25847,	[34608] = 28632,
	[36389] = 30321,	[36390] = 30322,	[36391] = 30323,	[36392] = 30324,
	[38473] = 31390,	[38475] = 31391,	[38476] = 31392,	[38477] = 31393,
	[38478] = 31394,	[38479] = 31395,	[40033] = 32441,	[40034] = 32442,
	[40035] = 32443,	[40036] = 32444,	[41132] = 35531,	[41133] = 35532,
	[41134] = 35529,	[41135] = 35530,	[42688] = 35296,	[43549] = 33792,
	[43846] = 33954,	[46140] = 35208,	[46141] = 35553,	[46142] = 35210,
	[46144] = 35211,	[54978] = 41124,	[54979] = 41123,	[54980] = 41120,
	[54981] = 41122,	[62202] = 44938,	[63187] = 45088,	[63188] = 45089,
	[63189] = 45090,	[63190] = 45091,	[63191] = 45092,	[63192] = 45093,

	-------------------------------------------------------------------------------
	-- Cooking
	-------------------------------------------------------------------------------
	[2542] = 2697,		[2543] = 728,		[2545] = 2698,		[2547] = 2699,
	[2548] = 2700,		[2549] = 2701,		[2795] = 2889,		[3370] = 3678,
	[3371] = 3679,		[3372] = 3680,		[3373] = 3681,		[3376] = 3682,
	[3377] = 3683,		[3397] = 3734,		[3398] = 3735,		[3399] = 3736,
	[3400] = 3737,		[4094] = 4609,		[6412] = 5482,		[6413] = 5483,
	[6414] = 5484,		[6415] = 5485,		[6416] = 5486,		[6417] = 44977,
	[6418] = 5488,		[6419] = 5489,		[6501] = 5528,		[7213] = 6039,
	[7751] = 6325,		[7752] = 6326,		[7753] = 6328,		[7754] = 6329,
	[7755] = 6330,		[7827] = 6368,		[7828] = 6369,		[8238] = 6661,
	[8607] = 6892,		[9513] = 18160,		[15853] = 12227,	[15855] = 12228,
	[15856] = 12229,	[15861] = 12231,	[15863] = 12232,	[15865] = 12233,
	[15906] = 12239,	[15910] = 12240,	[15915] = 16111,	[15933] = 16110,
	[15935] = 12226,	[18238] = 13939,	[18239] = 13940,	[18240] = 13942,
	[18241] = 13941,	[18242] = 13943,	[18243] = 13945,	[18244] = 13946,
	[18245] = 13947,	[18246] = 13948,	[18247] = 13949,	[20626] = 16767,
	[20916] = 17062,	[21143] = 17200,	[21144] = 17201,	[22480] = 18046,
	[22761] = 18267,	[24418] = 20075,	[25659] = 21025,	[25704] = 21099,
	[25954] = 21219,	[28267] = 22647,	[33276] = 27685,	[33277] = 27686,
	[33278] = 27687,	[33279] = 27684,	[33284] = 27688,	[33285] = 27689,
	[33286] = 27690,	[33287] = 27691,	[33288] = 27692,	[33289] = 27693,
	[33290] = 27694,	[33291] = 27695,	[33292] = 27696,	[33293] = 27697,
	[33294] = 27698,	[33295] = 27699,	[33296] = 27700,	[36210] = 30156,
	[38867] = 31675,	[38868] = 31674,	[43707] = 33870,	[43758] = 33871,
	[43761] = 33869,	[43765] = 33873,	[43772] = 33875,	[43779] = 33925,
	[45022] = 34413,	[45555] = 43018,	[45556] = 43019,	[45557] = 43020,
	[45558] = 43021,	[45559] = 43022,	[45567] = 43023,	[45568] = 43024,
	[45570] = 43026,	[45571] = 43025,	[45695] = 34834,	[46684] = 35564,
	[46688] = 35566,	[53056] = 39644,	[57423] = 43017,	[57433] = 43027,
	[57434] = 43028,	[57435] = 43029,	[57436] = 43030,	[57437] = 43031,
	[57438] = 43032,	[57439] = 43033,	[57440] = 43034,	[57441] = 43035,
	[57442] = 43036,	[57443] = 43037,	[58512] = 43507,	[58521] = 43508,
	[58523] = 43509,	[58525] = 43510,	[58527] = 43505,	[58528] = 43506,
	[62350] = 44954,

	-------------------------------------------------------------------------------
	-- Enchanting
	-------------------------------------------------------------------------------
	[7443] = 6342,		[7766] = 6344,		[7776] = 6346,		[7782] = 6347,
	[7786] = 6348,		[7793] = 6349,		[7859] = 6375,		[7867] = 6377,
	[13380] = 11038,	[13419] = 11039,	[13464] = 11081,	[13522] = 11098,
	[13536] = 11101,	[13612] = 11150,	[13617] = 11151,	[13620] = 11152,
	[13646] = 11163,	[13653] = 11164,	[13655] = 11165,	[13687] = 11167,
	[13689] = 11168,	[13698] = 11166,	[13817] = 11202,	[13841] = 11203,
	[13846] = 11204,	[13868] = 11205,	[13882] = 11206,	[13898] = 11207,
	[13915] = 11208,	[13931] = 11223,	[13933] = 11224,	[13945] = 11225,
	[13947] = 11226,	[15596] = 11813,	[15596] = 45050,	[20008] = 16214,
	[20009] = 16218,	[20010] = 16246,	[20011] = 16251,	[20012] = 16219,
	[20013] = 16244,	[20014] = 16216,	[20015] = 16224,	[20016] = 16222,
	[20017] = 16217,	[20020] = 16215,	[20023] = 16245,	[20024] = 16220,
	[20025] = 16253,	[20026] = 16221,	[20028] = 16242,	[20029] = 16223,
	[20030] = 16247,	[20031] = 16250,	[20032] = 16254,	[20033] = 16248,
	[20034] = 16252,	[20035] = 16255,	[20036] = 16249,	[20051] = 16243,
	[21931] = 17725,	[22749] = 18259,	[22750] = 18260,	[23799] = 19444,
	[23800] = 19445,	[23801] = 19446,	[23802] = 19447,	[23803] = 19448,
	[23804] = 19449,	[25072] = 33153,	[25072] = 20726,	[25073] = 20727,
	[25074] = 20728,	[25078] = 20729,	[25079] = 20730,	[25080] = 33152,
	[25080] = 20731,	[25081] = 20732,	[25082] = 20733,	[25083] = 33149,
	[25083] = 20734,	[25084] = 20735,	[25084] = 33150,	[25084] = 33151,
	[25086] = 20736,	[25086] = 33148,	[25124] = 20758,	[25125] = 20752,
	[25126] = 20753,	[25127] = 20754,	[25128] = 20755,	[25129] = 20756,
	[25130] = 20757,	[27837] = 22392,	[27906] = 22530,	[27911] = 22531,
	[27911] = 24000,	[27913] = 22532,	[27914] = 22533,	[27917] = 22534,
	[27920] = 22535,	[27924] = 22536,	[27926] = 22537,	[27927] = 22538,
	[27945] = 22539,	[27946] = 22540,	[27947] = 22541,	[27948] = 35298,
	[27948] = 22542,	[27950] = 22543,	[27951] = 22544,	[27954] = 22545,
	[27960] = 24003,	[27960] = 22547,	[27962] = 22548,	[27967] = 22552,
	[27968] = 22551,	[27971] = 22554,	[27972] = 22553,	[27975] = 22555,
	[27977] = 22556,	[27981] = 22560,	[27982] = 22561,	[27984] = 22559,
	[28003] = 22558,	[28004] = 22557,	[28016] = 22562,	[28019] = 22563,
	[28022] = 22565,	[32665] = 25848,	[32667] = 25849,	[33992] = 28270,
	[33994] = 28271,	[33997] = 28272,	[33999] = 28273,	[34003] = 28274,
	[34005] = 28276,	[34006] = 28277,	[34007] = 35299,	[34007] = 28279,
	[34008] = 35297,	[34008] = 28280,	[34009] = 28282,	[34010] = 28281,
	[42620] = 33165,	[42974] = 33307,	[44483] = 37332,	[44494] = 37333,
	[44524] = 37344,	[44556] = 37331,	[44575] = 44484,	[44576] = 44494,
	[44588] = 37340,	[44590] = 37334,	[44591] = 37347,	[44595] = 44473,
	[44596] = 37330,	[44621] = 37339,	[44625] = 44485,	[44631] = 37349,
	[45765] = 34872,	[46578] = 35498,	[46594] = 35500,	[47051] = 35756,
	[47672] = 44471,	[47898] = 44472,	[47899] = 44488,	[47901] = 44491,
	[59619] = 44496,	[59621] = 44492,	[59625] = 44495,	[60691] = 44483,
	[60692] = 44489,	[60707] = 44486,	[60714] = 44487,	[60763] = 44490,
	[60767] = 44498,	[62256] = 44944,	[62257] = 44945,	[62948] = 45059,
	[64441] = 46027,	[64579] = 46348,

	-------------------------------------------------------------------------------
	--Engineering
	-------------------------------------------------------------------------------
	[3928] = 4408,		[3933] = 4409,		[3939] = 13309,		[3940] = 4410,
	[3944] = 4411,		[3952] = 14639,		[3954] = 4412,		[3957] = 13308,
	[3959] = 4413,		[3960] = 4414,		[3966] = 4415,		[3968] = 4416,
	[3969] = 13311,		[3971] = 7742,		[3972] = 4417,		[3979] = 13310,
	[8243] = 6672,		[8339] = 6716,		[9269] = 7560,		[9273] = 7561,
	[12587] = 10601,	[12597] = 10602,	[12607] = 10603,	[12614] = 10604,
	[12615] = 10605,	[12616] = 10606,	[12617] = 10607,	[12620] = 10608,
	[12624] = 10609,	[15628] = 11828,	[15633] = 11827,	[19790] = 16041,
	[19791] = 16042,	[19792] = 16043,	[19793] = 16044,	[19794] = 16045,
	[19795] = 16047,	[19796] = 16048,	[19799] = 16049,	[19800] = 16051,
	[19814] = 16046,	[19815] = 16050,	[19819] = 16052,	[19825] = 16053,
	[19830] = 16054,	[19831] = 16055,	[19833] = 16056,	[21940] = 17720,
	[22793] = 18290,	[22795] = 18292,	[22797] = 18291,	[23066] = 18647,
	[23067] = 18649,	[23068] = 18648,	[23069] = 18650,	[23071] = 18651,
	[23077] = 18652,	[23078] = 18653,	[23079] = 18655,	[23080] = 18656,
	[23081] = 18657,	[23082] = 18658,	[23096] = 18654,	[23129] = 18661,
	[23507] = 19027,	[24356] = 20000,	[24357] = 20001,	[26416] = 21724,
	[26417] = 21725,	[26418] = 21726,	[26420] = 21727,	[26421] = 21728,
	[26422] = 21729,	[26423] = 21730,	[26424] = 21731,	[26425] = 21732,
	[26426] = 21733,	[26427] = 21734,	[26428] = 21735,	[26442] = 44919,
	[26443] = 44918,	[28327] = 22729,	[30313] = 23799,	[30314] = 23800,
	[30315] = 23802,	[30316] = 23803,	[30317] = 23804,	[30318] = 23805,
	[30325] = 23806,	[30329] = 23807,	[30332] = 23808,	[30334] = 23809,
	[30337] = 23810,	[30341] = 23811,	[30344] = 23814,	[30347] = 23815,
	[30348] = 23816,	[30349] = 23817,	[30547] = 23874,	[30548] = 23888,
	[30551] = 35310,	[30552] = 35311,	[30556] = 23887,	[32814] = 25887,
	[39895] = 32381,	[43676] = 33804,	[44391] = 34114,	[46106] = 35191,
	[46107] = 35187,	[46108] = 35189,	[46109] = 35190,	[46110] = 35192,
	[46111] = 35186,	[46112] = 35193,	[46113] = 35194,	[46114] = 35195,
	[46115] = 35196,	[46116] = 35197,	[46697] = 35582,	[55002] = 41111,
	[60866] = 44502,	[60867] = 44503,

	-------------------------------------------------------------------------------
	--Inscription
	-------------------------------------------------------------------------------

	-------------------------------------------------------------------------------
	--Jewelcrafting
	-------------------------------------------------------------------------------
	[25320] = 20856,	[25323] = 20855,	[25339] = 20854,	[25610] = 20970,
	[25612] = 20971,	[25617] = 20973,	[25618] = 20974,	[25619] = 20975,
	[25622] = 20976,	[26873] = 21940,	[26875] = 21941,	[26878] = 21942,
	[26881] = 21943,	[26882] = 21944,	[26887] = 21945,	[26896] = 21947,
	[26897] = 21948,	[26900] = 21949,	[26906] = 21952,	[26909] = 21953,
	[26910] = 21954,	[26912] = 21955,	[26914] = 21956,	[26915] = 21957,
	[28903] = 23130,	[28905] = 23131,	[28906] = 23133,	[28907] = 23134,
	[28910] = 23135,	[28912] = 23136,	[28914] = 23137,	[28915] = 23138,
	[28916] = 23140,	[28917] = 23141,	[28918] = 31359,	[28924] = 23143,
	[28927] = 23145,	[28933] = 23146,	[28936] = 23147,
	[28938] = 23148,	[28944] = 23149,	[28947] = 23150,	[28948] = 23151,
	[28950] = 23152,	[28953] = 23153,	[28955] = 23154,	[28957] = 23155,
	[31053] = 24158,	[31054] = 24159,	[31055] = 24160,	[31056] = 24161,
	[31057] = 24162,	[31058] = 24163,	[31060] = 24164,	[31061] = 24165,
	[31062] = 24174,	[31063] = 24175,	[31064] = 24176,	[31065] = 24177,
	[31066] = 24178,	[31067] = 24166,	[31068] = 24167,	[31070] = 24168,
	[31071] = 24169,	[31072] = 24170,	[31076] = 24171,	[31077] = 24172,
	[31078] = 24173,	[31079] = 24179,	[31080] = 31358,	[31081] = 24181,
	[31082] = 24182,	[31083] = 24183,	[31084] = 24193,	[31085] = 24194,
	[31087] = 24195,	[31088] = 35305,	[31089] = 35306,	[31090] = 24197,
	[31091] = 24198,	[31092] = 35304,	[31094] = 24201,	[31095] = 24202,
	[31096] = 24203,	[31097] = 24204,	[31098] = 35307,	[31099] = 24206,
	[31100] = 24207,	[31101] = 24208,	[31102] = 24209,	[31103] = 24210,
	[31104] = 24211,	[31105] = 24212,	[31106] = 24213,	[31107] = 24214,
	[31108] = 24215,	[31109] = 24216,	[31110] = 24217,	[31111] = 24218,
	[31112] = 24219,	[31113] = 24220,	[31149] = 24200,	[32866] = 25902,
	[32867] = 25903,	[32868] = 25905,	[32869] = 25906,	[32870] = 25904,
	[32871] = 25907,	[32872] = 25909,	[32873] = 25908,	[32874] = 25910,
	[34069] = 28291,	[34590] = 28596,	[37855] = 30826,	[38503] = 31401,
	[38504] = 31402,	[39451] = 31870,	[39452] = 31875,	[39455] = 31871,
	[39458] = 31872,	[39462] = 31877,	[39463] = 31876,	[39466] = 31873,
	[39467] = 31874,	[39470] = 31878,	[39471] = 31879,	[39705] = 35244,
	[39706] = 35246,	[39710] = 35250,	[39711] = 35248,	[39712] = 35245,
	[39713] = 35249,	[39714] = 35247,	[39715] = 35263,	[39716] = 35264,
	[39717] = 35262,	[39718] = 35265,	[39719] = 35255,	[39720] = 35260,
	[39721] = 35259,	[39722] = 35256,	[39723] = 35261,	[39724] = 35258,
	[39725] = 35257,	[39727] = 35243,	[39728] = 35242,	[39729] = 35238,
	[39730] = 35240,	[39731] = 35239,	[39732] = 35241,	[39733] = 35267,
	[39734] = 35269,	[39735] = 35268,	[39736] = 35266,	[39737] = 35270,
	[39738] = 35271,	[39739] = 35252,	[39740] = 35254,	[39741] = 35251,
	[39742] = 35253,	[39961] = 33622,	[39963] = 32411,	[42558] = 33305,
	[42588] = 33155,	[42589] = 33156,	[42590] = 33157,	[42591] = 33158,
	[42592] = 33159,	[42593] = 33160,	[43493] = 33783,	[44794] = 34689,
	[46122] = 35198,	[46123] = 35538,	[46124] = 35200,	[46125] = 35201,
	[46126] = 35533,	[46127] = 35535,	[46403] = 35322,	[46404] = 35323,
	[46405] = 35325,	[46597] = 35502,	[46601] = 35505,	[46775] = 35695,
	[46776] = 35696,	[46777] = 35697,	[46778] = 35698,	[46779] = 35699,
	[46803] = 35708,	[47053] = 35769,	[47054] = 35766,	[47055] = 35767,
	[47056] = 35768,	[48789] = 37504,	[53830] = 41576,	[53857] = 41559,
	[53865] = 41575,	[53869] = 41574,	[53875] = 41566,	[53877] = 41562,
	[53879] = 41565,	[53884] = 41563,	[53885] = 41561,	[53888] = 41564,
	[53917] = 41567,	[53919] = 41572,	[53921] = 41568,	[53924] = 41571,
	[53929] = 41573,	[53932] = 41570,	[53933] = 41569,	[53943] = 41560,
	[53945] = 41577,	[53946] = 41718,	[53948] = 41719,	[53949] = 41578,
	[53950] = 41817,	[53951] = 41790,	[53952] = 42138,	[53954] = 41581,
	[53955] = 41728,	[53957] = 41720,	[53958] = 41580,	[53959] = 41791,
	[53960] = 41727,	[53961] = 41579,	[53962] = 41784,	[53963] = 41747,
	[53964] = 41785,	[53965] = 41725,	[53966] = 41783,	[53967] = 41701,
	[53968] = 41740,	[53970] = 41796,	[53971] = 41703,	[53972] = 41820,
	[53973] = 41702,	[53974] = 41726,	[53975] = 41789,	[53976] = 41777,
	[53977] = 41780,	[53978] = 41734,	[53979] = 41794,	[53980] = 41582,
	[53981] = 41733,	[53982] = 41792,	[53983] = 41689,	[53984] = 41686,
	[53985] = 41688,	[53986] = 41730,	[53987] = 41690,	[53988] = 41721,
	[53990] = 41732,	[53991] = 41687,	[53992] = 41779,	[53993] = 41722,
	[53994] = 41818,	[53995] = 41795,	[53996] = 41723,	[53997] = 41698,
	[53998] = 41697,	[54000] = 41738,	[54001] = 41693,	[54002] = 41699,
	[54003] = 41781,	[54004] = 41782,	[54005] = 41737,	[54006] = 41694,
	[54008] = 41724,	[54009] = 41696,	[54010] = 41739,	[54011] = 41692,
	[54012] = 41819,	[54013] = 41736,	[54014] = 41735,	[54019] = 41793,
	[54023] = 41778,	[55384] = 41705,	[55387] = 41743,	[55388] = 41744,
	[55389] = 41704,	[55390] = 41786,	[55392] = 41706,	[55393] = 41742,
	[55395] = 41787,	[55396] = 41708,	[55397] = 41798,	[55398] = 41799,
	[55400] = 41710,	[55401] = 41797,	[55403] = 41711,	[55404] = 41709,
	[55405] = 41788,	[55407] = 41707,	[56049] = 42298,	[56052] = 42301,
	[56053] = 42309,	[56054] = 42299,	[56055] = 42314,	[56056] = 42302,
	[56074] = 42300,	[56076] = 42303,	[56077] = 42304,	[56079] = 42305,
	[56081] = 42306,	[56083] = 42307,	[56084] = 42308,	[56085] = 42310,
	[56086] = 42311,	[56087] = 42312,	[56088] = 42313,	[56089] = 42315,
	[56496] = 42648,	[56497] = 42649,	[56498] = 42650,	[56499] = 42651,
	[56500] = 42652,	[56501] = 42653,	[58147] = 43317,	[58148] = 43318,
	[58149] = 43319,	[58150] = 43320,	[58492] = 43485,	[58507] = 43497,
	[58954] = 43597,

	-------------------------------------------------------------------------------
	--Leatherworking
	-------------------------------------------------------------------------------
	[2158] = 2406,		[2163] = 2407,		[2164] = 2408,		[2169] = 2409,
	[3762] = 4293,		[3765] = 7360,		[3767] = 4294,		[3769] = 4296,
	[3771] = 4297,		[3772] = 7613,		[3773] = 4299,		[3775] = 4298,
	[3777] = 4300,		[3778] = 14635,		[3779] = 4301,		[4096] = 13287,
	[4097] = 13288,		[5244] = 5083,		[6702] = 5786,		[6703] = 5787,
	[6704] = 5788,		[6705] = 5789,		[7133] = 5972,		[7149] = 5973,	
	[7153] = 5974,		[7953] = 6474,		[7954] = 6475,		[7955] = 6476,	
	[8322] = 6710,		[9064] = 7288,		[9070] = 7289,		[9072] = 7290,	
	[9146] = 7361,		[9147] = 7362,		[9148] = 7363,		[9149] = 7364,
	[9195] = 7449,		[9197] = 7450,		[9202] = 7451,		[9207] = 7452,	
	[9208] = 7453,		[10490] = 8384,		[10509] = 8385,		[10516] = 8409,	
	[10520] = 8386,		[10525] = 8395,		[10529] = 8403,		[10531] = 8387,	
	[10533] = 8397,		[10542] = 8398,		[10544] = 8404,		[10546] = 8405,
	[10554] = 8399,		[10560] = 8389,		[10562] = 8390,		[10564] = 8400,	
	[10566] = 8406,		[10568] = 8401,		[10570] = 8402,		[10572] = 8407,	
	[10574] = 8408,		[19048] = 15724,	[19049] = 15725,	[19050] = 15726,
	[19051] = 15727,	[19052] = 15728,	[19053] = 15729,	[19054] = 15730,
	[19055] = 15731,	[19059] = 15732,	[19060] = 15733,	[19061] = 15734,
	[19062] = 15735,	[19063] = 15737,	[19064] = 15738,	[19065] = 15739,
	[19066] = 15740,	[19067] = 15741,	[19068] = 20253,	[19070] = 15743,
	[19071] = 15744,	[19072] = 15745,	[19073] = 15746,	[19074] = 15747,
	[19075] = 15748,	[19076] = 15749,	[19077] = 15751,	[19078] = 15752,
	[19079] = 15753,	[19080] = 20254,	[19081] = 15755,	[19082] = 15756,
	[19083] = 15757,	[19084] = 15758,	[19085] = 15759,	[19086] = 15760,
	[19087] = 15761,	[19088] = 15762,	[19089] = 15763,	[19090] = 15764,
	[19091] = 15765,	[19092] = 15768,	[19093] = 15769,	[19094] = 15770,
	[19095] = 15771,	[19097] = 15772,	[19098] = 15773,	[19100] = 15774,
	[19101] = 15775,	[19102] = 15776,	[19103] = 15777,	[19104] = 15779,
	[19107] = 15781,	[20853] = 17022,	[20854] = 17023,	[20855] = 17025,
	[21943] = 17722,	[22711] = 18239,	[22727] = 18252,	[22921] = 18514,
	[22922] = 18515,	[22923] = 18516,	[22926] = 18517,	[22927] = 18518,
	[22928] = 18519,	[23190] = 18731,	[23399] = 18949,	[23703] = 19326,
	[23704] = 19327,	[23705] = 19328,	[23706] = 19329,	[23707] = 19330,
	[23708] = 19331,	[23709] = 19332,	[23710] = 19333,	[24121] = 19769,
	[24122] = 19770,	[24123] = 19771,	[24124] = 19772,	[24125] = 19773,
	[24703] = 20382,	[24846] = 20506,	[24847] = 20507,	[24848] = 20508,
	[24849] = 20509,	[24850] = 20510,	[24851] = 20511,	[24940] = 20576,
	[26279] = 21548,	[28472] = 22771,	[28473] = 22770,	[28474] = 22769,
	[32455] = 25720,	[32457] = 25721,	[32458] = 25722,	[32461] = 25725,
	[32482] = 25726,	[32485] = 25728,	[32487] = 25729,	[32488] = 25731,
	[32489] = 25730,	[32490] = 25732,	[32493] = 25733,	[32494] = 25734,
	[32495] = 25735,	[32496] = 25736,	[32497] = 25737,	[32498] = 29213,
	[32499] = 29214,	[32500] = 29215,	[32501] = 29217,	[32502] = 29219,
	[32503] = 29218,	[35520] = 29669,	[35521] = 29672,	[35522] = 29673,
	[35523] = 29674,	[35524] = 29675,	[35525] = 29677,	[35526] = 29682,
	[35527] = 29684,	[35528] = 29691,	[35529] = 29689,	[35530] = 30444,
	[35531] = 29693,	[35532] = 29698,	[35533] = 29700,	[35534] = 29701,
	[35535] = 29702,	[35536] = 29703,	[35537] = 29704,	[35538] = 29713,
	[35539] = 34175,	[35543] = 29717,	[35544] = 34173,	[35549] = 31361,
	[35554] = 31362,	[35555] = 29720,	[35557] = 29721,	[35558] = 29723,
	[35559] = 35302,	[35560] = 29725,	[35561] = 29726,	[35562] = 35303,
	[35563] = 29728,	[35564] = 29729,	[35567] = 29730,	[35568] = 35300,
	[35572] = 29732,	[35573] = 35301,	[35574] = 29734,	[36349] = 30301,
	[36351] = 30302,	[36352] = 30303,	[36353] = 30304,	[36355] = 30305,
	[36357] = 30306,	[36358] = 30307,	[36359] = 30308,	[39997] = 32429,
	[40001] = 32431,	[40002] = 32432,	[40003] = 32433,	[40004] = 32434,
	[40005] = 32435,	[40006] = 32436,	[41156] = 35519,	[41157] = 35523,
	[41158] = 35527,	[41160] = 35528,	[41161] = 35517,	[41162] = 35524,
	[41163] = 35520,	[41164] = 35521,	[42546] = 33124,	[42731] = 33205,
	[44359] = 34200,	[44768] = 34218,	[44953] = 34262,	[45117] = 34491,
	[46132] = 35546,	[46133] = 35541,	[46134] = 35214,	[46135] = 35215,
	[46136] = 35216,	[46137] = 35217,	[46138] = 35218,	[46139] = 35549,
	[50970] = 44509,	[50971] = 44510,	[52733] = 32430,	[57683] = 43097,
	[57692] = 44559,	[57694] = 44560,	[57696] = 44561,	[57699] = 44562,
	[57701] = 44563,	[60645] = 44511,	[60647] = 44512,	[60697] = 44513,
	[60702] = 44514,	[60703] = 44515,	[60704] = 44516,	[60705] = 44517,
	[60706] = 44518,	[60711] = 44519,	[60712] = 44520,	[60715] = 44521,
	[60716] = 44522,	[60718] = 44523,	[60720] = 44524,	[60721] = 44525,
	[60723] = 44526,	[60725] = 44527,	[60727] = 44528,	[60728] = 44530,
	[60729] = 44531,	[60730] = 44532,	[60731] = 44533,	[60732] = 44534,
	[60734] = 44535,	[60735] = 44536,	[60737] = 44537,	[60743] = 44538,
	[60746] = 44539,	[60747] = 44540,	[60748] = 44541,	[60749] = 44542,
	[60750] = 44543,	[60751] = 44544,	[60752] = 44545,	[60754] = 44546,
	[60755] = 44547,	[60756] = 44548,	[60757] = 44549,	[60758] = 44550,
	[60759] = 44551,	[60760] = 44552,	[60761] = 44553,	[60996] = 44584,
	[60997] = 44585,	[60998] = 44586,	[60999] = 44587,	[61000] = 44588,
	[61002] = 44589,	[62176] = 44932,	[62177] = 44933,	[63194] = 45094,
	[63195] = 45095,	[63196] = 45096,	[63197] = 45097,	[63198] = 45098,
	[63199] = 45099,	[63200] = 45100,	[63201] = 45101,

	-------------------------------------------------------------------------------
	--Smelting
	-------------------------------------------------------------------------------
	[22967] = 44956,	[46353] = 35273,

	-------------------------------------------------------------------------------
	--Tailoring
	-------------------------------------------------------------------------------
	[2389] = 2598,		[2403] = 2601,		[3758] = 4292,		[3844] = 4346,	
	[3847] = 4345,		[3849] = 4347,		[3851] = 4349,		[3854] = 7114,	
	[3856] = 4350,		[3857] = 14630,		[3858] = 4351,		[3860] = 4352,	
	[3862] = 4355,		[3863] = 4353,		[3864] = 4356,		[3868] = 4348,	
	[3869] = 14627,		[3870] = 6401,		[3872] = 4354,		[3873] = 10728,	
	[6686] = 5771,		[6688] = 5772,		[6692] = 5773,		[6693] = 5774,	
	[6695] = 5775,		[7629] = 6271,		[7630] = 6270,		[7633] = 6272,	
	[7639] = 6274,		[7643] = 6275,		[7892] = 6390,		[7893] = 6391,	
	[8780] = 7092,		[8782] = 7091,		[8784] = 7090,		[8786] = 7089,	
	[8789] = 7087,		[8793] = 7084,		[8795] = 7085,		[8797] = 7086,	
	[8802] = 7088,		[12047] = 10316,	[12056] = 10300,	[12059] = 10301,
	[12060] = 10302,	[12064] = 10311,	[12066] = 10312,	[12075] = 10314,
	[12078] = 10315,	[12080] = 10317,	[12081] = 10318,	[12084] = 10320,
	[12085] = 10321,	[12086] = 10463,	[12089] = 10323,	[12091] = 10325,
	[12093] = 10326,	[18403] = 14466,	[18404] = 14467,	[18405] = 14468,
	[18406] = 14469,	[18407] = 14470,	[18408] = 14471,	[18409] = 14472,
	[18410] = 14473,	[18411] = 14474,	[18412] = 14476,	[18413] = 14477,
	[18414] = 14478,	[18415] = 14479,	[18416] = 14480,	[18417] = 14481,
	[18418] = 14482,	[18419] = 14483,	[18420] = 14484,	[18421] = 14485,
	[18422] = 14486,	[18423] = 14488,	[18424] = 14489,	[18434] = 14490,
	[18436] = 14493,	[18437] = 14492,	[18438] = 14491,	[18439] = 14494,
	[18440] = 14497,	[18441] = 14495,	[18442] = 14496,	[18444] = 14498,
	[18445] = 14499,	[18446] = 14500,	[18447] = 14501,	[18448] = 14507,
	[18449] = 14504,	[18450] = 14505,	[18451] = 14506,	[18452] = 14509,
	[18453] = 14508,	[18454] = 14511,	[18455] = 14510,	[18456] = 14512,
	[18457] = 14513,	[18458] = 14514,	[18560] = 14526,	[20848] = 17017,
	[20849] = 17018,	[21945] = 17724,	[22759] = 18265,	[22866] = 18414,
	[22867] = 18415,	[22868] = 18416,	[22869] = 18417,	[22870] = 18418,
	[22902] = 18487,	[23662] = 19215,	[23663] = 19218,	[23664] = 19216,
	[23665] = 19217,	[23666] = 19219,	[23667] = 19220,	[24091] = 19764,
	[24092] = 19765,	[24093] = 19766,	[24901] = 20546,	[24902] = 20548,
	[24903] = 20547,	[26085] = 21358,	[26087] = 21371,	[26403] = 44916,
	[26407] = 44917,	[26747] = 21892,	[26749] = 21893,	[26750] = 21894,
	[26751] = 21895,	[26752] = 21908,	[26753] = 21909,	[26754] = 21910,
	[26755] = 21911,	[26756] = 21912,	[26757] = 21914,	[26758] = 21913,
	[26759] = 21915,	[26760] = 21916,	[26761] = 21918,	[26762] = 21917,
	[26763] = 21919,	[26773] = 21896,	[26774] = 21897,	[26775] = 21898,
	[26776] = 21899,	[26777] = 21900,	[26778] = 21901,	[26779] = 21902,
	[26780] = 21903,	[26781] = 21904,	[26782] = 21905,	[26783] = 21906,
	[26784] = 21907,	[27658] = 22307,	[27659] = 22308,	[27660] = 22309,
	[27724] = 22310,	[27725] = 22312,	[28210] = 22683,	[28480] = 22774,
	[28481] = 22773,	[28482] = 22772,	[31373] = 24316,	[31430] = 24292,
	[31431] = 24293,	[31432] = 24294,	[31433] = 24295,	[31434] = 35308,
	[31435] = 24297,	[31437] = 24298,	[31438] = 24299,	[31440] = 24300,
	[31441] = 24301,	[31442] = 35309,	[31443] = 24303,	[31444] = 24304,
	[31448] = 24305,	[31449] = 24306,	[31450] = 24307,	[31451] = 24308,
	[31452] = 24309,	[31453] = 24310,	[31454] = 24311,	[31455] = 24312,
	[31456] = 24313,	[31459] = 24314,	[36315] = 30280,	[36316] = 30281,
	[36317] = 30282,	[36318] = 30283,	[36686] = 30483,	[37873] = 30833,
	[37882] = 30842,	[37883] = 30843,	[37884] = 30844,	[40020] = 32437,
	[40021] = 32438,	[40023] = 32439,	[40024] = 32440,	[40060] = 32447,
	[41205] = 35518,	[41206] = 35522,	[41207] = 35526,	[41208] = 35525,
	[44950] = 34261,	[44958] = 34319,	[46128] = 35204,	[46129] = 35544,
	[46130] = 35206,	[46131] = 35548,	[49677] = 37915,	[50194] = 38229,
	[50644] = 38327,	[50647] = 38328,	[55993] = 42172,	[55994] = 42173,
	[55996] = 42175,	[55997] = 42177,	[55998] = 42176,	[55999] = 42178,
	[56004] = 42183,	[56005] = 42184,	[56006] = 42185,	[56009] = 42187,
	[56011] = 42188,	[63924] = 45774,
}

local function LoadRecipe()

	local recipe_list = addon:GetRecipeTable()

	if (not recipe_list) then
		if (addon.db.profile.autoloaddb) then
			local dbloaded
			dbloaded,recipe_list = addon:InitRecipeData()

			if (not dbloaded) then return end

			for idx,prof in pairs(PROFESSIONS) do
				addon:AddRecipeData(prof)
			end
		else
			addon:Print(L["DATAMINER_NODB_ERROR"])
			return
		end
	else
		-- Recipe DB exists,we just need to populate it now
		if (addon.db.profile.autoloaddb) then
			for idx,prof in pairs(PROFESSIONS) do
				addon:AddRecipeData(prof)
			end
		end
	end
	return recipe_list

end

-------------------------------------------------------------------------------
-- Creates a reverse lookup for a recipe list
-------------------------------------------------------------------------------
local CreateReverseLookup

do
	local reverse_lookup = {}

	function CreateReverseLookup(recipe_list)
		if (not recipe_list) then
			addon:Print(L["DATAMINER_NODB_ERROR"])
			return
		end

		twipe(reverse_lookup)

		for i in pairs(recipe_list) do
			--if t[recipe_list[i]["Name"]] then addon:Print("Dupe: " .. i) end
			reverse_lookup[recipe_list[i]["Name"]] = i
		end

		return reverse_lookup
	end

end

-------------------------------------------------------------------------------
-- Tooltip for data-mining.
-------------------------------------------------------------------------------
local ARLDatamineTT = CreateFrame("GameTooltip","ARLDatamineTT",UIParent,"GameTooltipTemplate")

do
	-- Tables used in all the Scan functions within this do block. -Torhal
	local info,output = {},{}

	--- Function to compare the skill levels of a trainers recipes with those in the ARL database.
	-- @name AckisRecipeList:ScanSkillLevelData
	-- @param autoscan True when autoscan is enabled in preferences,it will surpress output letting you know when a scan has occured.
	-- @return Does a comparison of the information in your internal ARL database,and those items which are available on the trainer.  Compares the skill levels between the two.
	function addon:ScanSkillLevelData(autoscan)

		if (IsTradeskillTrainer()) then	-- Are we at a trade skill trainer?
			local recipe_list = LoadRecipe()	-- Get internal database

			if (not recipe_list) then
				self:Print(L["DATAMINER_NODB_ERROR"])
				return
			end
			-- Get the initial trainer filters
			local avail = GetTrainerServiceTypeFilter("available")
			local unavail = GetTrainerServiceTypeFilter("unavailable")
			local used = GetTrainerServiceTypeFilter("used")

			-- Clear the trainer filters
			SetTrainerServiceTypeFilter("available",1)
			SetTrainerServiceTypeFilter("unavailable",1)
			SetTrainerServiceTypeFilter("used",1)

			twipe(info)

			-- Get the skill levels from the trainer
			for i = 1,GetNumTrainerServices(),1 do
				local name = GetTrainerServiceInfo(i)
				local _,skilllevel = GetTrainerServiceSkillReq(i)
				if not skilllevel then
					skilllevel = 0
				end
				info[name] = skilllevel
			end
			local entryfound = false
			twipe(output)

			for i in pairs(recipe_list) do
				local i_name = recipe_list[i]["Name"]
				if (info[i_name]) and (info[i_name] ~= recipe_list[i]["Level"]) then
					entryfound = true
					tinsert(output,L["DATAMINER_SKILLELVEL"]:format(i_name,recipe_list[i]["Level"],info[i_name]))
				end
			end
			tinsert(output,"Trainer Skill Level Scan Complete.")

			if (entryfound) then
				self:DisplayTextDump(nil,nil,tconcat(output,"\n"))
			end
			-- Reset the filters to what they were before
			SetTrainerServiceTypeFilter("available",avail or 0)
			SetTrainerServiceTypeFilter("unavailable",unavail or 0)
			SetTrainerServiceTypeFilter("used",used or 0)

		elseif (not autoscan) then
			self:Print(L["DATAMINER_SKILLLEVEL_ERROR"])
		end
	end


	local teach,noteach = {},{}

	--- Function to compare which recipes are available from a trainer and compare with the internal ARL database.
	-- @name AckisRecipeList:ScanTrainerData
	-- @param autoscan True when autoscan is enabled in preferences,it will surpress output letting you know when a scan has occured.
	-- @return Does a comparison of the information in your internal ARL database,and those items which are available on the trainer.
	-- Compares the acquire information of the ARL database with what is available on the trainer.
	function addon:ScanTrainerData(autoscan)
		if (UnitExists("target") and (not UnitIsPlayer("target")) and (not UnitIsEnemy("player","target"))) then	-- Make sure the target exists and is a NPC
			local targetname = UnitName("target")	-- Get its name
			local targetID = tonumber(string.sub(UnitGUID("target"),-12,-7),16)	-- Get the NPC ID

			if (IsTradeskillTrainer()) then		-- Are we at a trade skill trainer?
				local recipe_list = LoadRecipe()	-- Get internal database

				if (not recipe_list) then
					self:Print(L["DATAMINER_NODB_ERROR"])
					return
				end

				-- Get the initial trainer filters
				local avail = GetTrainerServiceTypeFilter("available")
				local unavail = GetTrainerServiceTypeFilter("unavailable")
				local used = GetTrainerServiceTypeFilter("used")

				-- Clear the trainer filters
				SetTrainerServiceTypeFilter("available",1)
				SetTrainerServiceTypeFilter("unavailable",1)
				SetTrainerServiceTypeFilter("used",1)

				if (GetNumTrainerServices() == 0) then
					self:Print("Warning: Trainer is bugged,reporting 0 trainer items.")
				end
				twipe(info)

				-- Get all the names of recipes from the trainer
				for i = 1,GetNumTrainerServices(),1 do
					local name = GetTrainerServiceInfo(i)
					info[name] = true
				end
				twipe(teach)
				twipe(noteach)
				twipe(output)

				-- Dump out trainer info
				tinsert(output,L["DATAMINER_TRAINER_INFO"]:format(targetname,targetID))

				local teachflag = false
				local noteachflag = false

				for i in pairs(recipe_list) do
					local i_name = recipe_list[i]["Name"]
					local acquire = recipe_list[i]["Acquire"]
					local flags = recipe_list[i]["Flags"]

					-- If the trainer teaches this recipe
					if (info[i_name]) then
						local found = false
						-- Parse acquire info
						for j in pairs(acquire) do
							if (acquire[j]["Type"] == 1) then
								if (acquire[j]["ID"] == targetID) then
									found = true
								end
							end
						end

						if (not found) then
							tinsert(teach,i)
							teachflag = true

							if (not flags[3]) then
								tinsert(output,": Trainer flag needs to be set.")
							end
						end
						-- Trainer does not teach this recipe
					else
						local found = false
						-- Parse acquire info
						for j in pairs(acquire) do
							if (acquire[j]["Type"] == 1) then
								if (acquire[j]["ID"] == targetID) then
									found = true
								end
							end
						end
						if (found) then
							noteachflag = true
							tinsert(noteach,i)
						end
					end
				end

				if (teachflag) then
					tinsert(output,"Missing entries (need to be added):")
					tsort(teach)
					for i in ipairs(teach) do
						tinsert(output,L["DATAMINER_TRAINER_TEACH"]:format(teach[i],recipe_list[teach[i]]["Name"]))
					end
				end

				if (noteachflag) then
					tinsert(output,"Extra entries (need to be removed):")
					tsort(noteach)
					for i in ipairs(noteach) do
						tinsert(output,L["DATAMINER_TRAINER_NOTTEACH"]:format(noteach[i],recipe_list[noteach[i]]["Name"]))
					end
				end
				tinsert(output,"Trainer Acquire Scan Complete.")

				if ((teachflag) or (noteachflag)) then
					self:DisplayTextDump(nil,nil,tconcat(output,"\n"))
				end

				-- Reset the filters to what they were before
				SetTrainerServiceTypeFilter("available",avail or 0)
				SetTrainerServiceTypeFilter("unavailable",unavail or 0)
				SetTrainerServiceTypeFilter("used",used or 0)

			elseif (not autoscan) then
				self:Print(L["DATAMINER_SKILLLEVEL_ERROR"])
			end
		else
			if (not autoscan) then
				self:Print(L["DATAMINER_TRAINER_NOTTARGETTED"])
			end
		end
	end

end

--- Generates tradeskill links for all professions so you can scan them for completeness.
-- @name AckisRecipeList:GenerateLinks
-- @return Generates tradeskill links with all recipes.  Used for testing to see if a recipe is missing from the database or not.
function addon:GenerateLinks()
	-- This code adopted from Gnomish Yellow Pages with permission

	local guid = UnitGUID("player")
	local playerGUID = gsub(guid,"0x0+","")

	-- Listing of all tradeskill professions
	local tradelist = {51304,51300,51313,51306,45363,51311,51302,51309,51296,45542}

--[[
	local encodingLength = floor((#recipeList+5) / 6)

	local encodedString = string.rep("/",encodingLength)
]]--
	local bitmap = {}
	bitmap[45542] = "8bffAA" -- First Aid (6)
	bitmap[51296] = "2/7///7///9////7//////////g+/B" -- Cooking (30)
	bitmap[51306] = "4/////////////3nFA+///9+/P7//f//n//9dgdJgHA87/3f/TolD" -- Engineering (53)
	--bitmap[51302] = "e+//////////////v//P+f///3///7/9f9//////////f///////HQ5+////B4//+///////5///////PA/Eg//" -- LW (87)
	bitmap[51302] = string.rep("/",87)
	bitmap[51304] = "2//v//////f////3//v///////6//////////9////X" -- Alchemy (43)
	bitmap[51300] = string.rep("/",85) -- Blacksmithing (85)
	bitmap[51309] = string.rep("/",71) -- Tailoring (71)
	bitmap[51311] = string.rep("/",83) -- JC 83
	bitmap[45363] = string.rep("/",74) -- Inscription (74)
	--bitmap[51313] = "4//////////7///////////w//++/9vn7///////3P/t/n//BAB" -- Enchanting
	--bitmap[51313] = "4//////////7///////////w//++/9vn7///////3P/t/n//BAD" -- Enchanting (51)
	bitmap[51313] = string.rep("/",51) -- Enchanting (51)

	for i in pairs(tradelist) do

		local tradeName = GetSpellInfo(tradelist[i])
		local tradelink = {}
		tradelink[1] = "|cffffd000|Htrade:"
		tradelink[2] = tradelist[i]
		tradelink[3] = ":450:450:"
		tradelink[4] = playerGUID
		tradelink[5] = ":"
		tradelink[6] = bitmap[tradelist[i]]
		tradelink[7] = "|h["
		tradelink[8] = tradeName
		tradelink[9] = "]|h|r"

		if (bitmap[tradelist[i]]) then
			self:Print(tconcat(tradelink,""))
		else
			self:Print("I don't have the bitmap for " .. tradeName .. " yet.")
		end
		-- /script DEFAULT_CHAT_FRAME:AddMessage(gsub(GetTradeSkillListLink(),"\124","\124\124"))
	end

end

-------------------------------------------------------------------------------
--- Scans the items in the specified profession
-------------------------------------------------------------------------------
do

	local ORDERED_PROFESSIONS = {
		strlower(PROFESSIONS.Alchemy),		-- 1 Alchemy
		strlower(PROFESSIONS.Blacksmithing),	-- 2 Blacksmithing
		strlower(PROFESSIONS.Cooking),		-- 3 Cooking
		strlower(PROFESSIONS.Enchanting),	-- 4 Enchanting
		strlower(PROFESSIONS.Engineering),	-- 5 Engineering
		strlower(PROFESSIONS.FirstAid),		-- 6 First Aid
		strlower(PROFESSIONS.Inscription),	-- 7 Inscription
		strlower(PROFESSIONS.Jewelcrafting),	-- 8 Jewelcrafting
		strlower(PROFESSIONS.Leatherworking),	-- 9 Leatherworking
		strlower(PROFESSIONS.Runeforging),	-- 10 Runeforging
		strlower(PROFESSIONS.Smelting),		-- 11 Smelting
		strlower(PROFESSIONS.Tailoring),	-- 12 Tailoring
	}
	local recipe_list = {}

	local function ProfessionScan(prof_name)
		local master_list = LoadRecipe()
		
		if not master_list then
			addon:Print(L["DATAMINER_NODB_ERROR"])
			return
		end
		twipe(recipe_list)

		for i in pairs(master_list) do
			local prof = strlower(master_list[i]["Profession"])

			if prof and prof == prof_name then
				recipe_list[i] = master_list[i]
			end
		end

		local t = {}

		-- Parse the entire recipe database
		for i in pairs(recipe_list) do
			local ttscantext = addon:TooltipScanRecipe(i,false,true)
			if (ttscantext) then
				tinsert(t,ttscantext)
			end
		end
		addon:DisplayTextDump(nil,nil,tconcat(t,"\n"))
		ARLDatamineTT:Hide()
	end

	--- Parses all recipes for a specified profession,scanning their tool tips.
	-- @name AckisRecipeList:ScanProfession
	-- @usage AckisRecipeList:ScanProfession("first aid")
	-- @param prof_name The profession name or the spell ID of it,which you wish to scan.
	-- @return Recipes in the given profession have their tooltips scanned.
	function addon:ScanProfession(prof_name)
		if (type(prof_name) == "number") then
			prof_name = GetSpellInfo(prof_name)
		end
		
		local found = false
		prof_name = strlower(prof_name)

		local scan_all = prof_name == "all"

		if not scan_all then
			for idx,name in ipairs(ORDERED_PROFESSIONS) do
				if prof_name == name then
					found = true
					break
				end
			end

			if not found then
				self:Print(L["DATAMINER_NODB_ERROR"])
				return
			end

			ProfessionScan(prof_name)
		else
			for idx,name in ipairs(ORDERED_PROFESSIONS) do
				ProfessionScan(name)
			end
		end
	end

end	-- do

local RECIPE_NAMES = {
	-- JC
	["design: "] = true,
	-- LW or Tailoring
	["pattern: "] = true,
	-- Alchemy or Cooking
	["recipe: "] = true,
	-- BS
	["plans: "] = true,
	-- Enchanting
	["formula: "] = true,
	-- Engineering
	["schematic: "] = true,
	-- First Aid
	["manual: "] = true,

	["alchemy: "] = true,
	["blacksmithing: "] = true,
	["cooking: "] = true,
	["enchanting: "] = true,
	["engineering: "] = true,
	["first aid: "] = true,
	["inscription: "] = true,
	["jewelcrafting: "] = true,
	["leatherworking: "] = true,
	["tailoring: "] = true,
}

--- Scans the items on a vendor,determining which recipes are available if any and compares it with the database entries.
-- @name AckisRecipeList:ScanVendor
-- @usage AckisRecipeList:ScanVendor()
-- @return Obtains all the vendor information on tradeskill recipes and attempts to compare the current vendor with the internal database.
function addon:ScanVendor()
	if (UnitExists("target") and (not UnitIsPlayer("target")) and (not UnitIsEnemy("player","target"))) then	-- Make sure the target exists and is a NPC
		local recipe_list = LoadRecipe()		-- Get internal database

		if (not recipe_list) then
			self:Print(L["DATAMINER_NODB_ERROR"])
			return
		end
		local reverse_lookup = CreateReverseLookup(recipe_list)

		local targetname = UnitName("target")		-- Get its name
		local targetID = tonumber(string.sub(UnitGUID("target"),-12,-7),16)		-- Get the NPC ID

		local t = {}
		local added = false

		-- Parse all the items on the merchant
		for i = 1,GetMerchantNumItems(),1 do
		
			-- Get the name
			local name,_,_,_,numAvailable = GetMerchantItemInfo(i)
			
			if (name) then
				-- Lets scan recipes only on vendors
				local matchtext = strmatch(name,"%a+: ")
				-- Check to see if we're dealing with a recipe
				if (matchtext) and (RECIPE_NAMES[strlower(matchtext)]) then
					-- Get rid of the first part of the item
					local recipename = gsub(name,"%a+\: ","")
					-- Find out what spell ID we're using
					local spellid = reverse_lookup[recipename]
					-- Do the scan if we have the spell ID
					if (spellid) then
						added = true
						local ttscantext = addon:TooltipScanRecipe(spellid,true,true)
						if (ttscantext) then
							tinsert(t,ttscantext)
						end
						-- Ok now we know it's a vendor,lets check the database to see if the vendor is listed as an acquire method.
						local acquire = recipe_list[spellid]["Acquire"]
						local found = false
						for i in pairs(acquire) do
							local atype = acquire[i]["Type"]
							-- If the acquire type is a vendor
							if (((atype == 2) and (acquire[i]["ID"] == targetID))
								or ((atype == 6) and (acquire[i]["RepVendor"] == targetID))) then
								found = true
							end
						end
						if (not found) then
							tinsert(t,"Vendor ID missing from " .. spellid)
						end
					else
						--[===[@debug@
						added = true
						tinsert(t,"Spell ID not found for: " .. name)
						--@end-debug@]===]
					end
				end
			end
		end

		if added then
			self:DisplayTextDump(nil,nil,tconcat(t,"\n"))
		end
		ARLDatamineTT:Hide()
	else
		self:Print(L["DATAMINER_VENDOR_NOTTARGETTED"])
	end
end

--- Parses all the recipes in the database,and scanning their tooltips.
-- @name AckisRecipeList:TooltipScanDatabase
-- @usage AckisRecipeList:TooltipScanDatabase()
-- @return Entire recipe database has its tooltips scanned.
function addon:TooltipScanDatabase()
	-- Get internal database
	local recipe_list = LoadRecipe()

	if (not recipe_list) then
		self:Print(L["DATAMINER_NODB_ERROR"])
		return
	end

	local t = {}

	-- Parse the entire recipe database
	for i in pairs(recipe_list) do
		local ttscantext = addon:TooltipScanRecipe(i,false,true)
		if (ttscantext) then
			tinsert(t,ttscantext)
		end
	end
	self:DisplayTextDump(nil,nil,tconcat(t,"\n"))
end

--- Parses a specific recipe in the database,and scanning its tooltip.
-- @name AckisRecipeList:TooltipScanRecipe
-- @param spellid The [[[http://www.wowwiki.com/SpellLink | Spell ID]]] of the recipe being added to the database.
-- @param is_vendor Boolean to determine if we're viewing a vendor or not.
-- @param is_largescan Boolean to determine if we're doing a large scan.
-- @return Recipe has its tooltips scanned.
function addon:TooltipScanRecipe(spellid,is_vendor,is_largescan)
	local recipe_list = LoadRecipe()	-- Get internal database

	if (not recipe_list) then
		self:Print(L["DATAMINER_NODB_ERROR"])
		return
	end
	local reverse_lookup = CreateReverseLookup(recipe_list)

	ARLDatamineTT:SetOwner(WorldFrame,"ANCHOR_NONE")
	GameTooltip_SetDefaultAnchor(ARLDatamineTT,UIParent)

	if (recipe_list[spellid]) then
		local recipe_name = recipe_list[spellid]["Name"]
		local recipe_link = recipe_list[spellid]["RecipeLink"]

		-- If a link exists,we'll scan it.
		if (recipe_link) then
			ARLDatamineTT:SetHyperlink(recipe_link)	-- Load the tooltip

			-- Lets check to see if it's a recipe tooltip
			local text = strlower(_G["ARLDatamineTTTextLeft1"]:GetText())
			local matchtext = strmatch(text,"%a+: ")

			-- Check to see if we're dealing with a recipe
			if (RECIPE_NAMES[matchtext]) then
				self:ScanToolTip(recipe_name,recipe_list,reverse_lookup,is_vendor,false)

				local t = {}

				-- We have a reverse look-up for the item which creates the spell (aka the recipe itself)
				local itemid = SPELL_ITEM[spellid]
				if (itemid) then
					local incache = GetItemInfo(itemid)
					if (incache) then
						ARLDatamineTT:SetHyperlink("item:" .. itemid .. ":0:0:0:0:0:0:0")
						self:ScanToolTip(recipe_name,recipe_list,reverse_lookup,is_vendor,true)
					else
						tinsert(t,"Item ID: " .. itemid .. " not in cache.  If you have Querier use /iq " .. itemid)
					end
				end

				-- Add the flag scan to the table if it's not nil
				local results = self:PrintScanResults()

				if (results) then
					tinsert(t,results)
					if (is_largescan) then
						return tconcat(t,"\n")
					else
						self:Print(tconcat(t,"\n"))
					end
				else
					return nil
				end
			end

		-- Lets hide this output for runeforging.
		elseif (recipe_list[spellid]["Profession"] ~= GetSpellInfo(53428)) then
			self:Print("Missing RecipeLink for ID " .. spellid .. " - " .. recipe_name .. " (If these are DK abilities,don't worry,that's normal.")
		end
	else
		self:Print("Spell ID does not exist in the database.")
	end
	ARLDatamineTT:Hide()
end

-------------------------------------------------------------------------------
-- Tooltip-scanning code
-------------------------------------------------------------------------------
do

	local SPECIALTY_TEXT = {
		["requires spellfire tailoring"] = 26797,
		["requires mooncloth tailoring"] = 26798,
		["requires shadowweave tailoring"] = 26801,
		["dragonscale leatherworking"] = 10657,
		["elemental leatherworking"] = 10659,
		["tribal leatherworking"] = 10661,
		["gnomish engineering"] = 20219,
		["goblin engineering"] = 20222,
		["armorsmith"] = 9788,
		["master axesmith"] = 17041,
		["master hammersmith"] = 17040,
		["master swordsmith"] = 17039,
		["weaponsmith"] = 9787,
	}

	local FACTION_TEXT = {
		["thorium brotherhood"] = 98,
		["zandalar tribe"] = 100,
		["argent dawn"] = 96,
		["timbermaw hold"] = 99,
		["cenarion circle"] = 97,
		["the aldor"] = 101,
		["the consortium"] = 105,
		["the scryers"] = 110,
		["the sha'tar"] = 111,
		["the mag'har"] = 108,
		["cenarion expedition"] = 103,
		["honor hold"] = 104,
		["thrallmar"] = 104,
		["the violet eye"] = 114,
		["sporeggar"] = 113,
		["kurenai"] = 108,
		["keepers of time"] = 106,
		["the scale of the sands"] = 109,
		["lower city"] = 107,
		["ashtongue deathsworn"] = 102,
		["alliance vanguard"] = 131,
		["valiance expedition"] = 126,
		["horde expedition"] = 130,
		["the taunka"] = 128,
		["the hand of vengeance"] = 127,
		["explorers' league"] = 125,
		["the kalu'ak"] = 120,
		["shattered sun offensive"] = 112,
		["warsong offensive"] = 129,
		["kirin tor"] = 118,
		["the wyrmrest accord"] = 122,
		["knights of the ebon blade"] = 117,
		["frenzyheart tribe"] = 116,
		["the oracles"] = 121,
		["argent crusade"] = 115,
		["the sons of hodir"] = 119,
	}

	local FACTION_LEVELS = {
		["neutral"] = 0,
		["friendly"] = 1,
		["honored"] = 2,
		["revered"] = 3,
		["exalted"] = 4,
	}

	local CLASS_TYPES = {
		["Deathknight"]	= 21,	["Druid"]	= 22,	["Hunter"]	= 23,
		["Mage"]	= 24,	["Paladin"]	= 25,	["Priest"]	= 26,
		["Shaman"]	= 27,	["Rogue"]	= 28,	["Warlock"]	= 29,
		["Warrior"]	= 30,
	}

	local ORDERED_CLASS_TYPES = {
		[1]	= "Deathknight",	[2]	= "Druid",	[3]	= "Hunter",
		[4]	= "Mage",		[5]	= "Paladin",	[6]	= "Priest",
		[7]	= "Shaman",		[8]	= "Rogue",	[9]	= "Warlock",
		[10]	= "Warrior",
	}

	local ROLE_TYPES = {
		["dps"]		= 51,	["tank"]	= 52,	["healer"]	= 53,
		["caster"]	= 54,	["RESERVED1"]	= 55,
	}

	local ORDERED_ROLE_TYPES = {
		[1]	= "dps",	[2]	= "tank",	[3]	= "healer",
		[4]	= "caster",	[5]	= "RESERVED1",
	}

	local ITEM_TYPES = {
		-- Armor types
		["Cloth"]	= 56,	["Leather"]	= 57,	["Mail"]	= 58,
		["Plate"]	= 59,	["Cloak"]	= 60,	["Trinket"]	= 61,
		["Ring"]	= 62,	["Necklace"]	= 63,	["Shield"]	= 64,
		["RESERVED2"]	= 65,

		-- Weapon types
		["OneHanded"]	= 66,	["TwoHanded"]	= 67,	["Axe"]		= 68,
		["Sword"]	= 69,	["Mace"]	= 70,	["Polearm"]	= 71,
		["Dagger"]	= 72,	["Staff"]	= 73,	["Wand"]	= 74,
		["Thrown"]	= 75,	["Bow"]		= 76,	["CrossBow"]	= 77,
		["Ammo"]	= 78,	["Fist"]	= 79,	["Gun"]		= 80,
	}

	local ORDERED_ITEM_TYPES = {
		-- Armor types
		[1]	= "Cloth",	[2]	= "Leather",	[3]	= "Mail",
		[4]	= "Plate",	[5]	= "Cloak",	[6]	= "Trinket",
		[7]	= "Ring",	[8]	= "Necklace",	[9]	= "Shield",
		[10]	= "RESERVED2",

		-- Weapon types
		[11]	= "OneHanded",	[12]	= "TwoHanded",	[13]	= "Axe",
		[14]	= "Sword",	[15]	= "Mace",	[16]	= "Polearm",
		[17]	= "Dagger",	[18]	= "Staff",	[19]	= "Wand",
		[20]	= "Thrown",	[21]	= "Bow",	[22]	= "CrossBow",
		[23]	= "Ammo",	[24]	= "Fist",	[25]	= "Gun",
	}

	-- Table to store scanned information. Wiped and re-used every scan.
	local scan_data = {}

	--- Parses the mining tooltip for certain keywords,comparing them with the database flags.
	-- @name AckisRecipeList:ScanToolTip
	-- @param name The name of the recipe
	-- @param recipe_list Recipe database
	-- @param reverse_lookup Reverse lookup database
	-- @param is_vendor Boolean to indicate if we're scanning a vendor.
	-- @param is_item Boolean to indicate if we're scanning an item tooltip.
	-- @return Scans a tooltip,and outputs the missing or extra filter flags.
	function addon:ScanToolTip(name,recipe_list,reverse_lookup,is_vendor,is_item)
		-- We only want to wipe the table if we're scanning a new entry (not an item associated with a spell ID)
		if (not is_item) then
			twipe(scan_data)
		end
		scan_data.match_name = name
		scan_data.recipe_list = recipe_list
		scan_data.reverse_lookup = reverse_lookup
		scan_data.is_vendor = is_vendor
		scan_data.is_item = is_item

		-- Parse all the lines of the tooltip
		for i = 1,ARLDatamineTT:NumLines(),1 do
			local text_l = _G["ARLDatamineTTTextLeft" .. i]:GetText()
			local text_r = _G["ARLDatamineTTTextRight" .. i]:GetText()
			local text
 
			if text_r then
				text = text_l .. " " .. text_r
			else
				text = text_l
			end

			local text = strlower(text)

			-- Check for recipe/item binding
			-- The recipe binding is within the first few lines of the tooltip always
			if strmatch(text,"binds when picked up") then
				if (i < 3) then
					scan_data.boprecipe = true
				else
					scan_data.bopitem = true
				end
			end

			-- Recipe Specialities
			if SPECIALTY_TEXT[text] then
				scan_data.specialty = SPECIALTY_TEXT[text]
			end

			-- Recipe Reputations
			if (strmatch(text,"Requires (.+) %- (.+)")) then
				local rep,replevel = strmatch(text,"Requires (.+) %- (.+)")
				if (FACTION_TEXT[rep]) then
					scan_data.repid = FACTION_TEXT[rep]
					scan_data.repidlevel = FACTION_LEVELS[replevel]
				end
			end

			-- Flag so that we don't bother checking for classes if we're sure of the class
			-- AKA +spell hit == caster DPS only no matter what other stats are on it
			-- Saves processing cycles and it won't cause the flags to be overwritten if a non-specific stat is found after
			scan_data.verifiedclass = false

			if (not scan_data.verifiedclass) then
				-- Certain stats can be considered for a specific role (aka spell hit == caster dps).
				if (strmatch(text,"strength") and (strmatch(text,"strength of the clefthoof") == nil) and (strmatch(text, "set:") == nil)) then
					scan_data.dps = true
					scan_data.caster = false
					scan_data.healer = false
				elseif (strmatch(text,"agility")) then
					scan_data.dps = true
					scan_data.caster = false
					scan_data.healer = false
				elseif (strmatch(text,"spirit")) then
					scan_data.dps = false
					scan_data.tank = false
					scan_data.caster = true
					scan_data.healer = true
				elseif (strmatch(text,"spell power")) then
					scan_data.dps = false
					scan_data.tank = false
					scan_data.caster = true
					scan_data.healer = true
				elseif (strmatch(text,"spell crit")) then
					scan_data.dps = false
					scan_data.tank = false
					scan_data.caster = true
					scan_data.healer = true
				elseif (strmatch(text,"spell hit")) then
					scan_data.dps = false
					scan_data.tank = false
					scan_data.caster = true
					scan_data.healer = false
					scan_data.verifiedclass = true
				elseif (strmatch(text,"spell penetration")) then
					scan_data.dps = false
					scan_data.tank = false
					scan_data.caster = true
					scan_data.healer = false
					scan_data.verifiedclass = true
				elseif (strmatch(text,"mana every 5 seconds")) then
					scan_data.dps = false
					scan_data.tank = false
					scan_data.caster = true
					scan_data.healer = true
				elseif (strmatch(text,"attack power")) then
					scan_data.dps = true
					scan_data.caster = false
					scan_data.healer = false
				elseif (strmatch(text,"expertise")) then
					scan_data.dps = true
					scan_data.caster = false
					scan_data.healer = false
				elseif (strmatch(text,"melee crit")) then
					scan_data.dps = true
					scan_data.caster = false
					scan_data.healer = false
				elseif (strmatch(text,"ranged crit")) then
					scan_data.dps = true
					scan_data.tank = false
					scan_data.caster = false
					scan_data.healer = false
					scan_data.verifiedclass = true
				elseif (strmatch(text,"melee haste")) then
					scan_data.dps = true
					scan_data.caster = false
					scan_data.healer = false
				elseif (strmatch(text,"ranged haste")) then
					scan_data.dps = true
					scan_data.tank = false
					scan_data.caster = false
					scan_data.healer = false
					scan_data.verifiedclass = true
				elseif (strmatch(text,"melee hit")) then
					scan_data.dps = true
					scan_data.caster = false
					scan_data.healer = false
				elseif (strmatch(text,"ranged hit")) then
					scan_data.dps = true
					scan_data.tank = false
					scan_data.caster = false
					scan_data.healer = false
					scan_data.verifiedclass = true
				elseif (strmatch(text,"armor pen")) then
					scan_data.dps = true
					scan_data.caster = false
					scan_data.healer = false
				elseif (strmatch(text,"feral attack power")) then
					scan_data.tank = true
					scan_data.dps = true
					scan_data.caster = false
					scan_data.healer = false
				elseif (strmatch(text,"defense")) then
					scan_data.dps = false
					scan_data.tank = true
					scan_data.caster = false
					scan_data.healer = false
					scan_data.verifiedclass = true
				elseif (strmatch(text,"block")) then
					scan_data.dps = false
					scan_data.tank = true
					scan_data.caster = false
					scan_data.healer = false
					scan_data.verifiedclass = true
				elseif (strmatch(text,"parry")) then
					scan_data.dps = false
					scan_data.tank = true
					scan_data.caster = false
					scan_data.healer = false
					scan_data.verifiedclass = true
				elseif (strmatch(text,"dodge") and (strmatch(text, "set:") == nil)) then
					scan_data.dps = false
					scan_data.tank = true
					scan_data.caster = false
					scan_data.healer = false
					scan_data.verifiedclass = true
				end
			end

			-- Classes
			if (strmatch(text,"death knight")) then
				scan_data.Deathknight = true
				scan_data.found_class = true
			elseif (strmatch(text,"druid")) then
				scan_data.Druid = true
				scan_data.found_class = true
			elseif (strmatch(text,"hunter")) then
				scan_data.Hunter = true
				scan_data.found_class = true
			elseif ((strmatch(text,"mage")) and (strmatch(text,"damage") == nil) and (strmatch(text,"mageweave") == nil) and (strmatch(text,"archmage") == nil)) then
				scan_data.Mage = true
				scan_data.found_class = true
			elseif (strmatch(text,"paladin")) then
				scan_data.Paladin = true
				scan_data.found_class = true
			elseif (strmatch(text,"priest")) then
				scan_data.Priest = true
				scan_data.found_class = true
			elseif (strmatch(text,"rogue")) then
				scan_data.Rogue = true
				scan_data.found_class = true
			elseif (strmatch(text,"shaman")) then
				scan_data.Shaman = true
				scan_data.found_class = true
			elseif (strmatch(text,"warlock")) then
				scan_data.Warlock = true
				scan_data.found_class = true
			elseif (strmatch(text,"warrior")) then
				scan_data.Warrior = true
				scan_data.found_class = true
			-- Armor types
			-- Check the end of the item for cloth and leather because we can craft something with those items in it
			elseif (strmatch(text,"cloth$")) then
				scan_data.Cloth = true
			elseif (strmatch(text,"leather$")) then
				scan_data.Leather = true
			elseif (strmatch(text,"mail")) then
				scan_data.Mail = true
			elseif (strmatch(text,"plate")) then
				scan_data.Plate = true
			elseif (strmatch(text,"cloak")) then
				scan_data.Cloak = true
			elseif (strmatch("finger", text)) then
				scan_data.Ring = true
			elseif (strmatch(text,"necklace")) then
				scan_data.Necklace = true
			elseif (strmatch(text,"shield")) then
				scan_data.Shield = true
				-- Weapon types
			elseif (strmatch(text,"1 hand")) or (strmatch(text,"off hand")) then
				scan_data.OneHanded = true
			elseif (strmatch(text,"2 hand")) then
				scan_data.TwoHanded = true
			elseif (strmatch(text,"axe")) then
				scan_data.Axe = true
			elseif (strmatch(text,"sword") and (strmatch(text,"swordguard") == nil)) then
				scan_data.Sword = true
			elseif (strmatch(text,"mace")) then
				scan_data.Mace = true
			elseif (strmatch(text,"polearm")) then
				scan_data.Polearm = true
			elseif (strmatch(text,"dagger")) then
				scan_data.Dagger = true
			elseif (strmatch(text,"staff")) then
				scan_data.Staff = true
			elseif (strmatch(text,"wand")) then
				scan_data.Wand = true
			elseif (strmatch(text,"thrown")) then
				scan_data.Thrown = true
			elseif (strmatch(text,"bow")) then
				scan_data.Bow = true
			elseif (strmatch(text,"crossbow")) then
				scan_data.CrossBow = true
			elseif (strmatch(text,"gun")) then
				scan_data.Gun = true
			elseif (strmatch(text,"ammo") and (strmatch(text,"mammoth") == nil)) then
				scan_data.Ammo = true
			elseif (strmatch(text,"fist")) then
				scan_data.Fist = true
			end
		end	-- for
		
	end

	-- Flag data for printing. Wiped and re-used.
	local missing_flags = {}
	local extra_flags = {}

	--- Prints out the results of the tooltip scan.
	-- @name AckisRecipeList:PrintScanResults
	function addon:PrintScanResults()

		-- Parse the recipe database until we get a match on the name
		local recipe_name = gsub(scan_data.match_name,"%a+%?: ","")
		local spellid = scan_data.reverse_lookup[recipe_name]
		-- Output table
		local t = {}

		if (not spellid) then
			self:Print("Recipe " .. recipe_name .. " has no reverse lookup")
			return
		end

		local flags = scan_data.recipe_list[spellid]["Flags"]
		local acquire = scan_data.recipe_list[spellid]["Acquire"]
		twipe(missing_flags)
		twipe(extra_flags)

		if (scan_data.is_vendor) then
			if (not flags[4]) then
				tinsert(missing_flags,"4 (Vendor)")
			end

			if (((GetSubZoneText() == "Wintergrasp Fortress") or (GetSubZoneText() == "Halaa")) and (not flags[9])) then
				tinsert(missing_flags,"9 (PvP)")
			elseif (flags[9]) then
				tinsert(extra_flags,"9 (PvP)")
			end
		end

		-- If we've picked up at least one class flag
		if (scan_data.found_class) then
			for k,v in ipairs(ORDERED_CLASS_TYPES) do
				if scan_data[v] and not flags[CLASS_TYPES[v]] then
					tinsert(missing_flags,tostring(CLASS_TYPES[v]).." ("..v..")")
				elseif not scan_data[v] and flags[CLASS_TYPES[v]] then
					tinsert(extra_flags,tostring(CLASS_TYPES[v]).." ("..v..")")
				end
			end
		else	-- Recipe is not class specific - every flag should be set.
			for k,v in ipairs(ORDERED_CLASS_TYPES) do
				if not flags[CLASS_TYPES[v]] then
					tinsert(missing_flags,tostring(CLASS_TYPES[v]).." ("..v..")")
				end
			end
		end

		-- BoP Item
		if (scan_data.is_item) then
			if (scan_data.bopitem) and (not flags[37]) then
				tinsert(missing_flags,"37 (BoP Item)")
				-- If it's a BoP item and flags BoE is set,mark it as extra
				if (flags[36]) then
					tinsert(extra_flags,"36 (BoE Item)")
				end
				-- If it's a BoP item and flags BoA is set,mark it as extra
				if (flags[38]) then
					tinsert(extra_flags,"38 (BoA Item)")
				end
				-- BoE Item,assuming it's not BoA
			elseif (not flags[36]) and (not scan_data.bopitem) then
				tinsert(missing_flags,"36 (BoE Item)")
				-- If it's a BoE item and flags BoP is set,mark it as extra
				if (flags[37]) then
					tinsert(extra_flags,"37 (BoP Item)")
				end
				-- If it's a BoE item and flags BoA is set,mark it as extra
				if (flags[38]) then
					tinsert(extra_flags,"38 (BoA Item)")
				end
			end
		else

			-- BoP Recipe
			if (scan_data.boprecipe) and (not flags[41]) then
				tinsert(missing_flags,"41 (BoP Recipe)")
				-- If it's a BoP recipe and flags BoE is set,mark it as extra
				if (flags[40]) then
					tinsert(extra_flags,"40 (BoE Recipe)")
				end
				-- If it's a BoP recipe and flags BoA is set,mark it as extra
				if (flags[42]) then
					tinsert(extra_flags,"42 (BoA Recipe)")
				end
				-- Not BoP recipe,assuming it's not BoA - trainer-taught recipes don't have bind information, skip those.
			elseif not flags[3] and (not flags[40]) and (not scan_data.boprecipe) then
				tinsert(missing_flags,"40 (BoE Recipe)")
				-- If it's a BoE recipe and flags BoP is set,mark it as extra
				if (flags[41]) then
					tinsert(extra_flags,"41 (BoP Recipe)")
				end
				-- If it's a BoE recipe and flags BoA is set,mark it as extra
				if (flags[42]) then
					tinsert(extra_flags,"42 (BoA Recipe)")
				end
			end
		end

		for k,v in ipairs(ORDERED_ROLE_TYPES) do
			if scan_data[v] and not flags[ROLE_TYPES[v]] then
				tinsert(missing_flags,tostring(ROLE_TYPES[v]).." ("..v..")")
			elseif not scan_data[v] and flags[ROLE_TYPES[v]] then
				tinsert(extra_flags,tostring(ROLE_TYPES[v]).." ("..v..")")
			end
		end

		for k,v in ipairs(ORDERED_ITEM_TYPES) do
			if scan_data[v] and not flags[ITEM_TYPES[v]] then
				tinsert(missing_flags,tostring(ITEM_TYPES[v]).." ("..v..")")
			elseif not scan_data[v] and flags[ITEM_TYPES[v]] then
				tinsert(extra_flags,tostring(ITEM_TYPES[v]).." ("..v..")")
			end
		end

		-- Reputations
		local repid = scan_data.repid
		local addedtotable = false

		if ((repid) and (not flags[repid])) then
			tinsert(missing_flags,repid)
			for i,j in pairs(acquire) do
				if (acquire[j]["Type"] == 6) then
					local tmpacquire = acquire[j]
					if (tmpacquire["RepLevel"] ~= scan_data.repidlevel) then
						tinsert(t,"Rep level wrong. " .. recipe_name .. " (" .. spellid .. ")")
					end
				end
			end
		end

		if (#missing_flags > 0) or (#extra_flags > 0) then
			addedtotable = true
			tinsert(t,recipe_name .. " (" .. spellid .. ")")

			-- Add a string of the missing flag numbers
			if (#missing_flags > 0) then
				tinsert(t,"Missing flags: " .. tconcat(missing_flags,","))
			end

			-- Add a string of the extra flag numbers
			if (#extra_flags > 0) then
				tinsert(t,"Extra flags: " .. tconcat(extra_flags,","))
			end

			local count = 0

			for k,v in ipairs(ORDERED_ITEM_TYPES) do
				if scan_data[v] then
					count = count + 1
				end
			end

			if count == 0 then
				tinsert(t,"Missing: item type flag")
			elseif count > 1 then
				tinsert(t,"Extra: item type flag")
			end

		end

		-- Check to see if we have a horde/alliance flag, all recipes must have one of these
		if (not flags[1]) and (not flags[2]) then
			addedtotable = true
			tinsert(t,"Horde or alliance not selected. " .. recipe_name .. " (" .. spellid .. ")")
		end

		-- Check to see if we have an obtain method flag, all recipes must have at least one of these
		if ((not flags[3]) and (not flags[4]) and (not flags[5]) and (not flags[6]) and (not flags[7])
		and (not flags[8]) and (not flags[9]) and (not flags[10]) and (not flags[11]) and (not flags[12])) then
			addedtotable = true
			tinsert(t,"No obtain flag. " .. recipe_name .. " (" .. spellid .. ")")
		end

		-- Check for recipe binding information, all recipes must have one of these
		if (not flags[40]) and (not flags[41]) and (not flags[42]) then
			addedtotable = true
			tinsert(t,"No recipe binding information. " .. recipe_name .. " (" .. spellid .. ")")
		end

		-- Check for item binding information, all recipes must have one of these
		if (not flags[36]) and (not flags[37]) and (not flags[38]) then
			addedtotable = true
			tinsert(t,"No item binding information. " .. recipe_name .. " (" .. spellid .. ")")
		end

		-- We need to code this better.  Some items (aka bags) won't have a role at all.
--[[
		-- Check for player role flags
		if (not scan_data.tank) and (not scan_data.healer) and (not scan_data.caster) and (not scan_data.dps) then
			addedtotable = true
			tinsert(t,"No player role flag. " .. recipe_name .. " (" .. spellid .. ")")
		end
]]--

		if (scan_data.specialty) then
			if (not scan_data.recipe_list[spellid]["Specialty"]) then
				addedtotable = true
				tinsert(t,"Recipe " ..  recipe_name .. " (" .. spellid .. ") Missing Specialty: " .. scan_data.specialty)
			elseif (scan_data.recipe_list[spellid]["Specialty"] ~= scan_data.specialty) then
				tinsert(t,"Recipe " ..  recipe_name .. " (" .. spellid .. ") Wrong Specialty: " .. scan_data.specialty)
			end
		elseif (scan_data.recipe_list[spellid]["Specialty"]) then
			addedtotable = true
			tinsert(t,"Recipe " ..  recipe_name .. " (" .. spellid .. ") Extra Specialty: " .. scan_data.recipe_list[spellid]["Specialty"])
		end

		if (addedtotable) then
			return tconcat(t,"\n")
		else
			return nil
		end

	end

end
